From: Florian Müllner Date: Wed, 12 Jun 2024 11:13:41 +0000 (+0200) Subject: status/network: Show notification when detecting captive portal X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~226^2^2~16 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=4ab1ccf3f21b754ce4be77becf5df46084a893d8;p=gnome-shell.git status/network: Show notification when detecting captive portal When NetworkManager detects limited connectivity, we currently pop up the portal helper window immediately. This can both be disruptive when it happens unexpectedly, and unnoticeable when it happens during screen lock. In any case, it seems better to not pop up a window without explicit user action, so instead show a notification that launches the portal window when activated. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7688 Part-of: --- diff --git a/js/ui/status/network.js b/js/ui/status/network.js index d34e94707..72b3431da 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -1951,19 +1951,43 @@ class CaptivePortalHandler extends Signals.EventEmitter { this._checkUri = checkUri; this._connectivityQueue = new Set(); + this._notifications = new Map(); this._portalHelperProxy = null; } - addConnection(path) { - if (this._connectivityQueue.has(path)) + addConnection(name, path) { + if (this._connectivityQueue.has(path) || this._notifications.has(path)) return; - this._launchPortalHelper(path).catch(logError); + const source = MessageTray.getSystemSource(); + + const notification = new MessageTray.Notification({ + title: _('Sign Into Wi–Fi Network'), + body: name, + source, + }); + notification.connect('activated', + () => this._onNotificationActivated(path)); + notification.connect('destroy', + () => this._notifications.delete(path)); + this._notifications.set(path, notification); + source.addNotification(notification); } + removeConnection(path) { if (this._connectivityQueue.delete(path)) this._portalHelperProxy?.CloseAsync(path); + this._notifications.get(path)?.destroy( + MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); + this._notifications.delete(path); + } + + _onNotificationActivated(path) { + this._launchPortalHelper(path).catch(logError); + + Main.overview.hide(); + Main.panel.closeCalendar(); } _portalHelperDone(parameters) { @@ -2014,6 +2038,10 @@ class CaptivePortalHandler extends Signals.EventEmitter { for (const item of this._connectivityQueue) this._portalHelperProxy?.CloseAsync(item); this._connectivityQueue.clear(); + + for (const n of this._notifications.values()) + n.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); + this._notifications.clear(); } } @@ -2167,7 +2195,9 @@ class Indicator extends SystemIndicator { if (!isPortal || Main.sessionMode.isGreeter) return; - this._portalHandler.addConnection(this._mainConnection.get_path()); + this._portalHandler.addConnection( + this._mainConnection.get_id(), + this._mainConnection.get_path()); } _updateIcon() {